package biz

import (
	"context"
	"github.com/go-kratos/kratos/v2/log"
)

type User struct {
	Uid     int64
	Name    string
	Contact string
}

type UserRepo interface {
	GetUser(context.Context, int64) (*User, error)
	// 传入查询条件形式待定
	GetUsers(context.Context, interface{}) ([]User, error)
	CreateUser(context.Context, *User) error
	UpdateUser(context.Context, *User) error
	DeleteUser(context.Context, *User) error
}

// 下面应该有跟多逻辑，错误包装等
// 事物传递考虑在context中传递，在internal内定义公共key进行try获取，若有使用获取的否则使用默认
// 若获取到的事务对象与数据库不兼容，则依然使用默认。该方法已在项目中使用
// TryGetSession(ctx context.Context, def Session) Session {}

type UserUsecase struct {
	repo UserRepo
	log  *log.Helper
}

func NewUserUsecase(repo UserRepo, logger log.Logger) *UserUsecase {
	return &UserUsecase{repo: repo, log: log.NewHelper("usecase/user", logger)}
}

func (s *UserUsecase) Get(ctx context.Context, id int64) (*User, error) {
	return s.repo.GetUser(ctx, id)
}
func (s *UserUsecase) Gets(ctx context.Context, where interface{}) ([]User, error) {
	return s.repo.GetUsers(ctx, where)
}
func (s *UserUsecase) Create(ctx context.Context, meta *User) error {
	return s.repo.CreateUser(ctx, meta)
}
func (s *UserUsecase) Update(ctx context.Context, meta *User) error {
	return s.repo.UpdateUser(ctx, meta)
}
func (s *UserUsecase) Delete(ctx context.Context, meta *User) error {
	return s.repo.DeleteUser(ctx, meta)
}
